home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-3279 / degaspic / degaspic.mod < prev    next >
Text File  |  1987-04-21  |  6KB  |  110 lines

  1. MODULE Pic;  (* this creates a small desk accessory that loads a DEGAS pic
  2.                 at boot time and then shows it whenever the desk accessory
  3.                 slot is clicked on.  A click on the right mouse button will
  4.                 return the user to his normal display.  When compiling this
  5.                 with TDI's compiler, you must use GEMACCX.LNK instead of
  6.                 the normal GEMX.LNK.  The easiest way is to copy GEMACCX.LNK                from the GEMLIB folder to your main compiling directory
  7.                 and then change its name to  GEMX.LNK.  Compile and link
  8.                 as normal, making sure that your new GEMX.LNK is used.  
  9.                 Change the resulting PIC.PRG to a file with an ACC extender,                such as PIC.ACC,  and it should work fine. *)
  10.  
  11. FROM SYSTEM IMPORT ADDRESS, ADR;
  12.  
  13. IMPORT AESApplications, AESWindows, AESEvents, AESGraphics, XBIOS, GEMDOS,
  14.        AESMenus, AESForms;
  15.  
  16. FROM XBIOS IMPORT GetResolution;
  17.  
  18.  
  19. VAR
  20.         apid           : INTEGER;
  21.         accNumber      : INTEGER;
  22.         FreeRam        : ADDRESS;
  23.         pic            : ADDRESS;   (* address of our picture screen *)
  24.         count          : LONGCARD;
  25.         OK             : BOOLEAN;     (* true if a picture was loaded *)  
  26.         handle         : INTEGER;
  27.         orgPalette     : XBIOS.Palette;  (* 0..15 of cardinal *)
  28.         newPalette     : POINTER TO XBIOS.Palette;  (* same thing *)
  29.         PictureName    : ARRAY[0..6] OF CHAR;  (*  picture name *)
  30.  
  31.         
  32. PROCEDURE Event;
  33.           (*  this is the main loop that waits for our desk accessory
  34.               slot to be clicked on.  If a picture was loaded it will
  35.               be shown, after the present palette is saved.  Then when
  36.               the right button is clicked the old palette will be 
  37.               restored and the screen switched back to show the old data.
  38.               If no picture was loaded, then an alert box is shown.
  39.               The user can release the picture buffer for his own use if
  40.               he clicks the right button when the mouse is in the extreme
  41.               upper left corner of the screen  Users should do this before
  42.               they change resolutions because a new buffer will be loaded
  43.               in anyway. The mouse X and Y coords are returned in the
  44.               button message *)
  45.  
  46. VAR
  47.         physScreen      : ADDRESS;
  48.         logScreen       : ADDRESS;
  49.         result          : INTEGER;
  50.         x,y,button,key  : INTEGER;
  51.         msg             : ARRAY[0..15] OF CARDINAL;
  52.         
  53. BEGIN
  54.         REPEAT
  55.            AESEvents.EventMessage(ADR(msg));
  56.            IF msg[0] = 40 THEN   (* if our accessory selected *)
  57.              IF  OK THEN         (* if pic found *)
  58.               physScreen := XBIOS.ScreenPhysicalBase(); (* get phys screen *)              logScreen := XBIOS.ScreenLogicalBase();  (* get log screen *)
  59.               FOR result := 0 TO 15 DO   (* save palette for restoring *)  
  60.                  orgPalette[result] := XBIOS.SetColour(result,newPalette^[result]);        END;  (* FOR *)
  61.               AESGraphics.GrafMouse(256,NIL);  (* turn mouse off *)
  62.               XBIOS.SetScreenBase(pic,pic,-1);  (* switch to pic screen *)
  63.               AESWindows.WindowUpdate(3);       (* grab control from AES *)
  64.               (* wait for a button click and then restore old screen *)
  65.               result := AESEvents.EventButton(1,2,2,x,y,button,key);
  66.               AESWindows.WindowUpdate(2);       (* give AES mouse control *)
  67.               XBIOS.SetPalette(orgPalette);  (* restore old palette *)
  68.               XBIOS.SetScreenBase(physScreen,logScreen,-1);  (* restore *)
  69.               IF (x = 0) AND (y = 0) THEN (* upper left corner. free ram *)
  70.                  IF GEMDOS.Free(FreeRam) THEN END; (* release RAM *)
  71.                  OK := FALSE;  (* no more pic since RAM released *)
  72.               END;  (* if user decided to release RAM *)
  73.               AESGraphics.GrafMouse(257,NIL);     (* turn mouse on *)
  74.            ELSE result := AESForms.FormAlert(1,'[3][ Sorry, but no picture to show. ][ OK ]');
  75.           END;  (* IF OK *)
  76.         END;  (* if acc open *)
  77.         UNTIL FALSE;
  78. END Event;
  79.  
  80. BEGIN
  81.         (* this does the normal GEM initialization and then allocates
  82.            RAM for a buffer to store the picture in. The ST's resolution
  83.            is checked and then the proper DEGAS extender is used to load
  84.            the first picture in the current directory with the proper
  85.            DEGAS extender.  IF no picture is loaded, OK is set to FALSE
  86.            and the RAM is released.  After this is taken care of, the
  87.            Event procedure performs an endless loop waiting for the
  88.            accessory slot to be clicked on *)
  89.            
  90.         apid := AESApplications.ApplInitialise();  (* get an ID *)
  91.         accNumber := AESMenus.MenuRegister(apid,"  Show Picture"); 
  92.              (* we just grabbed acc slot and set name to "Show Picture" *)
  93.         GEMDOS.Alloc(32290,FreeRam);         (* grab picture buffer *)
  94.         pic := FreeRam + (256 - (FreeRam MOD 256));  
  95.                        (* now we are on a 256 byte boundry, as needed *) 
  96.         newPalette := pic -32; (* address of palette *)
  97.         PictureName := "*.piX";  (* we will set "X" in extender for res *)
  98.         (* now get resolution (0,1,2) add 49 to get ASCII chr for res *)
  99.         PictureName[4] := CHR(GetResolution()+49);  (* PI1, PI2, or PI3 *)
  100.         GEMDOS.Open(PictureName,0,handle);
  101.         IF handle > 5 THEN (* pic found *)
  102.            count := 32034;
  103.            GEMDOS.Read(handle,count,(pic-34));
  104.            OK := GEMDOS.Close(handle);
  105.         ELSE 
  106.            OK := FALSE; (* couldn't load picture so *)
  107.            IF GEMDOS.Free(FreeRam) THEN END;(* free up memory *)
  108.         END; (* IF *)
  109.         Event; 
  110. END Pic.